--SÒLO ES UNA PRUEBA
CREATE OR REPLACE TRIGGER GENERA_CARGO
BEFORE INSERT ON INSCRIPCION
FOR EACH ROW
DECLARE
	VNUM NUMBER(2);
	BEGIN
		SELECT COUNT(*) INTO VNUM FROM NIVEL;
--		IF SQL%NOTFOUND THEN
--			DBMS_OUTPUT.PUT_LINE('NO HUBO RESPUESTA');
--		ELSE
--			INSERT INTO RESPALDO VALUES(:NEW.IDPERSONA,:NEW.NOMBREPERSONA,
--				:NEW.EDADPERSONA);
--			DBMS_OUTPUT.PUT_LINE('REGISTRO RESPALDADO');
--		END IF;
	DBMS_OUTPUT.PUT_LINE('TOTAL NIVELES ES: '|| VNUM);
END GENERA_CARGO;
/


--####### INICIO 	##############
CREATE SEQUENCE AUTO_IDDESCUENTO
INCREMENT BY 1 MINVALUE 10000001;

--2DA PARTE: ALTA SERVICIOS
--ESTE PROCEDIMIENTO YA ESTÀ FUNCIONANDO
CREATE OR REPLACE PROCEDURE PAGAR_CARGO(IDCARGO$ IN NUMBER,ABONO$ IN NUMBER)
AS
	FECHAPAGO$ DATE:=SYSDATE;
	ABONADO$ NUMBER(11,2);
BEGIN
	SELECT ABONO INTO ABONADO$ FROM CARGO WHERE IDCARGO=IDCARGO$;
	IF SQL%NOTFOUND THEN
		DBMS_OUTPUT.PUT_LINE('NO EXISTE EL CARGO A SALDAR');
	ELSE
		IF ABONADO$ > 0 THEN --SÒLO SE PUEDE ABONAR UNA ÙNICA VEZ	
			DBMS_OUTPUT.PUT_LINE('ESTE CARGO YA HA SIDO ABONADO TOTAL O PARCIALMENTE');
		ELSE
			UPDATE CARGO SET ABONO=ABONO$, FECHAPAGO=FECHAPAGO$ WHERE IDCARGO=IDCARGO$;
			DBMS_OUTPUT.PUT_LINE('SE SALDÒ EL CARGO');
			COMMIT;
			PROC_AFTER_GENERA_DESCUENTO(IDCARGO$);--LLAMA AL PROCEDIMIENTO QUE GENARA LOS DESCUENTOS
		END IF;
	END IF;
END PAGAR_CARGO;
/

EXEC PAGAR_CARGO(10000003,2000);

--EL TRIGGER PARA LA TABLA CARGO OCURRE DESPÙES DE ACTUALIZAR, CUANDO SE PAGA UN CARGO GENERA UN DESCUENTO
--ESTE TRIGGER FUNCIONA HASTA QUE INTENTA MODIFICAR DATOS DE LA TABLA QUE LO ACTIVA, ES AHI CUANDO FALLA (DICE QUE ESTA MUTANDO)
CREATE OR REPLACE TRIGGER GENERA_DESCUENTO
AFTER UPDATE ON CARGO
FOR EACH ROW
DECLARE
	IDCARGO$		NUMBER(8);
	FECHACARGO$ 	DATE;
	FECHAVEN$ 	DATE;
	FECHAPAGO$ 	DATE;
	IMPORTE$ 	NUMBER(12,2);
	NUMERO_PAGOS$ NUMBER(2);
	PAGO$ 		 NUMBER(3);
	ABONO$ 		NUMBER(12,2);
	CVS$ 		CHAR(2);
	CARGO$ 		NUMBER(8);
	IDINSCRIPCION$ NUMBER(8);
	IDSERVICIO$    NUMBER(8);

	BEGIN

		IDCARGO$:=:NEW.IDCARGO;
		FECHACARGO$:=:NEW.FECHACARGO;
		FECHAVEN$:=:NEW.FECHAVEN;
		FECHAPAGO$:=:NEW.FECHAPAGO;
		IMPORTE$:=:NEW.IMPORTE;
		NUMERO_PAGOS$:=:NEW.NUMERO_PAGOS;
		PAGO$:=:NEW.PAGO;
		ABONO$:=:NEW.ABONO;
		CVS$:=:NEW.CVS;
		CARGO$:=:NEW.CARGO;
		IDINSCRIPCION$:=:NEW.IDINSCRIPCION;
		IDSERVICIO$:=:NEW.IDSERVICIO;

		PROC_TRIGGER(IDCARGO$,FECHACARGO$,FECHAVEN$,FECHAPAGO$,IMPORTE$,NUMERO_PAGOS$,PAGO$,ABONO$,CVS$,CARGO$,IDINSCRIPCION$,IDSERVICIO$);

END GENERA_DESCUENTO;
/



--CREATE OR REPLACE PROCEDURE PROC_TRIGGER(IDCARGO$ IN NUMBER,FECHACARGO$ IN DATE,FECHAVEN$ IN DATE,FECHAPAGO$ IN DATE,IMPORTE$ IN NUMBER,NUMERO_PAGOS$ IN NUMBER,PAGO$ IN NUMBER,ABONO$ IN NUMBER,CVS$ IN CHAR,CARGO$ IN NUMBER,IDINSCRIPCION$ IN NUMBER,IDSERVICIO$ IN NUMBER)
CREATE OR REPLACE PROCEDURE PROC_AFTER_GENERA_DESCUENTO(IDCARGO$ IN NUMBER)
AS
	FECHACARGO$ 	DATE;
	FECHAVEN$ 	DATE;
	FECHAPAGO$ 	DATE;
	IMPORTE$ 	NUMBER(12,2);
	NUMERO_PAGOS$ NUMBER(2);
	PAGO$ 		 NUMBER(3);
	ABONO$ 		NUMBER(12,2);
	CVS$ 		CHAR(2);
	CARGO$ 		NUMBER(8);
	IDINSCRIPCION$ NUMBER(8);
	IDSERVICIO$    NUMBER(8);

	ABONADO$ NUMBER(11,2);

	TOTAL$	NUMBER(12,2);
	IDDESCUENTO_AUTO$ NUMBER(8);
	IDCARGO_AUTO$ NUMBER(8);
	MONTODESCUENTO$ NUMBER(12,2);
	NUEVO_IMPORTE$ NUMBER(12,2);
	
BEGIN

	SELECT 	FECHACARGO,FECHAVEN,FECHAPAGO,IMPORTE,NUMERO_PAGOS,PAGO,ABONO,CVS,CARGO,IDINSCRIPCION,IDSERVICIO
	 INTO FECHACARGO$,FECHAVEN$,FECHAPAGO$,IMPORTE$,NUMERO_PAGOS$,PAGO$,ABONO$,CVS$,CARGO$,IDINSCRIPCION$,IDSERVICIO$
	 FROM CARGO WHERE IDCARGO=IDCARGO$;

	TOTAL$:= IMPORTE$ - ABONO$;
	--IDDESCUENTO$:=AUTO_IDDESCUENTO.NEXTVAL;
	MONTODESCUENTO$:=ABONO$ * 0.05;
	NUEVO_IMPORTE$:=IMPORTE$-ABONO$;

	IF TOTAL$ <= 0 THEN--SI SE SALDÒ TODO EL IMPORTE DEL CARGO
		DBMS_OUTPUT.PUT_LINE('PAGÒ POR COMPLETO');

		IF SYSDATE <= FECHACARGO$ THEN --SI SE PAGA CON TIEMPO ANTICIPADO
			IF CVS$='SI' THEN --SI SE TRATA DE UN CARGO POR SERVICIO VENCIDO NO PUEDE HABER DESCUENTO
				DBMS_OUTPUT.PUT_LINE('NO SE GENERÒ DESCUENTO');
			ELSE --SI NO  ES UN CARGO POR SERVICIO VENCIDO SÌ HAY DESCUENTO
				IDDESCUENTO_AUTO$:=AUTO_IDDESCUENTO.NEXTVAL;
				INSERT INTO DESCUENTO(IDDESCUENTO,IDCARGO,FECHADESC,IMPORTE,APLICADO,CARGOAPLICADO,REMUNERADO)
				VALUES(IDDESCUENTO_AUTO$,IDCARGO$,SYSDATE,MONTODESCUENTO$,'NO',NULL,'NO');
				DBMS_OUTPUT.PUT_LINE('SE SALDÒ COMPLETAMENTE EL CARGO: '||IDCARGO$||' Y SE GENERÒ EL DESCUENTO: '||IDDESCUENTO_AUTO$||' POR UN MONTO DE: '||MONTODESCUENTO$);
			END IF;
		ELSE --SI NO SE PAGA CON TIEMPO ANTICIPADO
			DBMS_OUTPUT.PUT_LINE('PAGÒ DESPÙES DE FECHACARGO');
		END IF;

	ELSE --SI SE PAGA PARCIALMENTE

		IF SYSDATE <= FECHACARGO$ THEN --SI SE PAGA CON TIEMPO ANTICIPADO
			IF CVS$='SI' THEN --SI SE TRATA DE UN CARGO POR SERVICIO VENCIDO NO PUEDE HABER DESCUENTO
				DBMS_OUTPUT.PUT_LINE('NO SE GENERÒ DESCUENTO');
				DBMS_OUTPUT.PUT_LINE('SE SALDÒ PARCIALMENTE EL CARGO POR VENCIMIENTO: '||IDCARGO$);

				IDCARGO_AUTO$:=AUTO_IDCARGO.NEXTVAL;
				INSERT INTO CARGO(IDCARGO,FECHACARGO,FECHAVEN,FECHAPAGO,IMPORTE,NUMERO_PAGOS,PAGO,ABONO,CVS,CARGO,IDINSCRIPCION,IDSERVICIO)
				VALUES(IDCARGO_AUTO$,SYSDATE,FECHAVEN$,NULL,NUEVO_IMPORTE$,0,0,0,'SI',IDCARGO$,IDINSCRIPCION$,IDSERVICIO$);						

				DBMS_OUTPUT.PUT_LINE('SE GENERÒ EL SUBCARGO: '||IDCARGO_AUTO$);				
			ELSE --SI NO  ES UN CARGO POR SERVICIO VENCIDO SÌ HAY DESCUENTO
				IDDESCUENTO_AUTO$:=AUTO_IDDESCUENTO.NEXTVAL;
				INSERT INTO DESCUENTO(IDDESCUENTO,IDCARGO,FECHADESC,IMPORTE,APLICADO,CARGOAPLICADO,REMUNERADO)
				VALUES(IDDESCUENTO_AUTO$,IDCARGO$,SYSDATE,MONTODESCUENTO$,'NO',NULL,'NO');
				DBMS_OUTPUT.PUT_LINE('SE SALDÒ PARCIALMENTE EL CARGO: '||IDCARGO$||' Y SE GENERÒ EL DESCUENTO: '||IDDESCUENTO_AUTO$||' POR UN MONTO DE: '||MONTODESCUENTO$);

				IDCARGO_AUTO$:=AUTO_IDCARGO.NEXTVAL;
				INSERT INTO CARGO(IDCARGO,FECHACARGO,FECHAVEN,FECHAPAGO,IMPORTE,NUMERO_PAGOS,PAGO,ABONO,CVS,CARGO,IDINSCRIPCION,IDSERVICIO)
				VALUES(IDCARGO_AUTO$,SYSDATE,FECHAVEN$,NULL,NUEVO_IMPORTE$,0,0,0,NULL,IDCARGO$,IDINSCRIPCION$,IDSERVICIO$);						

				DBMS_OUTPUT.PUT_LINE('SE GENERÒ EL SUBCARGO: '||IDCARGO_AUTO$);
			END IF;
		ELSE --SI NO SE PAGA CON TIEMPO ANTICIPADO
--MODIFICANDO

			IF CVS$='SI' THEN --SI SE TRATA DE UN CARGO POR SERVICIO VENCIDO NO PUEDE HABER DESCUENTO
				DBMS_OUTPUT.PUT_LINE('NO SE GENERÒ DESCUENTO');
				DBMS_OUTPUT.PUT_LINE('SE SALDÒ PARCIALMENTE EL CARGO POR VENCIMIENTO: '||IDCARGO$);

				IDCARGO_AUTO$:=AUTO_IDCARGO.NEXTVAL;
				INSERT INTO CARGO(IDCARGO,FECHACARGO,FECHAVEN,FECHAPAGO,IMPORTE,NUMERO_PAGOS,PAGO,ABONO,CVS,CARGO,IDINSCRIPCION,IDSERVICIO)
				VALUES(IDCARGO_AUTO$,SYSDATE,FECHAVEN$,NULL,NUEVO_IMPORTE$,0,0,0,'SI',IDCARGO$,IDINSCRIPCION$,IDSERVICIO$);						

				DBMS_OUTPUT.PUT_LINE('SE GENERÒ EL SUBCARGO: '||IDCARGO_AUTO$);				
			ELSE --SI NO  ES UN CARGO POR SERVICIO VENCIDO
				DBMS_OUTPUT.PUT_LINE('NO SE GENERÒ DESCUENTO');
				DBMS_OUTPUT.PUT_LINE('SE SALDÒ PARCIALMENTE EL CARGO: '||IDCARGO$);

				IDCARGO_AUTO$:=AUTO_IDCARGO.NEXTVAL;
				INSERT INTO CARGO(IDCARGO,FECHACARGO,FECHAVEN,FECHAPAGO,IMPORTE,NUMERO_PAGOS,PAGO,ABONO,CVS,CARGO,IDINSCRIPCION,IDSERVICIO)
				VALUES(IDCARGO_AUTO$,SYSDATE,FECHAVEN$,NULL,NUEVO_IMPORTE$,0,0,0,NULL,IDCARGO$,IDINSCRIPCION$,IDSERVICIO$);						

				DBMS_OUTPUT.PUT_LINE('SE GENERÒ EL SUBCARGO: '||IDCARGO_AUTO$);
			END IF;

		END IF;

	END IF;


END PROC_AFTER_GENERA_DESCUENTO;
/

--·#####################################

CREATE OR REPLACE PROCEDURE GENERAR_CVS
AS
	CURSOR CURSOR_TABLA_CARGO$ IS
	SELECT * FROM CARGO ORDER BY IDCARGO;

	CARGO_ACTUAL$ NUMBER(8);
	SUBCARGO$ NUMBER(8);
	FECHACARGO$ DATE;
	IMPORTE$ NUMBER(12,2);
	IDCARGO_AUTO$ NUMBER(8);

BEGIN
	
	FOR C_CARGO$ IN CURSOR_TABLA_CARGO$ LOOP
		IF (SYSDATE >= C_CARGO$.FECHAVEN) AND (C_CARGO$.ABONO = 0) THEN

			IF (C_CARGO$.CVS = 'SI') THEN
				DBMS_OUTPUT.PUT_LINE('');
			ELSE

				CARGO_ACTUAL$:=C_CARGO$.IDCARGO;
				SELECT COUNT(*) INTO SUBCARGO$ FROM CARGO WHERE CARGO=CARGO_ACTUAL$;

				IF SUBCARGO$=0 THEN
					
					IDCARGO_AUTO$:=AUTO_IDCARGO.NEXTVAL;
					FECHACARGO$:=C_CARGO$.FECHAVEN+10;
					IMPORTE$:=C_CARGO$.IMPORTE*0.05;
					INSERT INTO CARGO(IDCARGO,FECHACARGO,FECHAVEN,FECHAPAGO,IMPORTE,NUMERO_PAGOS,PAGO,ABONO,CVS,CARGO,IDINSCRIPCION,IDSERVICIO)
					VALUES(IDCARGO_AUTO$,FECHACARGO$,C_CARGO$.FECHAVEN,NULL,IMPORTE$,0,0,0,'SI',CARGO_ACTUAL$,C_CARGO$.IDINSCRIPCION,C_CARGO$.IDSERVICIO);

					--DBMS_OUTPUT.PUT_LINE('FECHACARGO= '||FECHACARGO$);
					--DBMS_OUTPUT.PUT_LINE('CARGO DEL= '||IMPORTE$);

				END IF;

			END IF;

		END IF;

	END LOOP;

END GENERAR_CVS;
/

EXEC GENERAR_CVS;

--################################3


CREATE OR REPLACE PROCEDURE REMUNERAR_DESC(IDDESCUENTO$ IN NUMBER)
AS
	EXISTEN_REGS$ NUMBER(8);
	EXISTE_DESC$ NUMBER(8);
	YA_REMUNERADO$ NUMBER(8);
	IMPORTE$ NUMBER(12,2);
BEGIN
	GENERAR_CVS;--ANTES QUE NADA, SE CORROBORA QUE NO SE TENGA QUE CALCULAR NUEVOS CARGOS POR CVS
	SELECT COUNT(*) INTO EXISTEN_REGS$ FROM DESCUENTO;
	IF EXISTEN_REGS$ = 0 THEN
		DBMS_OUTPUT.PUT_LINE('NO EXISTEN DESCUENTOS');
	ELSE
		SELECT COUNT(*) INTO EXISTE_DESC$ FROM DESCUENTO WHERE IDDESCUENTO=IDDESCUENTO$;
		IF EXISTE_DESC$=0 THEN
			DBMS_OUTPUT.PUT_LINE('NO EXISTE EL DESCUENTO EN CUESTION');
		ELSE -- EL IDDESCUENTO EXISTE
			SELECT COUNT(*) INTO YA_REMUNERADO$ FROM DESCUENTO WHERE IDDESCUENTO=IDDESCUENTO$ AND (REMUNERADO='SI' OR APLICADO='SI');
			IF YA_REMUNERADO$>0 THEN
				DBMS_OUTPUT.PUT_LINE('EL DESCUENTO YA HA SIDO REMUNERADO O APLICADO CON ANTERIORIDAD');
			ELSE--SI NO HA SIDO REMUNERADO
				UPDATE DESCUENTO SET REMUNERADO='SI' WHERE IDDESCUENTO=IDDESCUENTO$;
				SELECT IMPORTE INTO IMPORTE$ FROM DESCUENTO WHERE IDDESCUENTO=IDDESCUENTO$;
				COMMIT;
				DBMS_OUTPUT.PUT_LINE('EL DESCUENTO DE $'||IMPORTE$||' HA SIDO REMUNERADO');
			END IF;			
		END IF;		
	END IF;
END REMUNERAR_DESC;
/

EXEC REMUNERAR_DESC(10000002);

--############################ 


CREATE OR REPLACE PROCEDURE APLICAR_DESCUENTO(IDDESCUENTO$ IN NUMBER,CARGOAPLICADO$ IN NUMBER)
AS
	EXISTEN_REGS$ NUMBER(8);
	EXISTE_DESC$ NUMBER(8);
	EXISTE_CARGO$ NUMBER(8);
	YA_APLICADO$ NUMBER(8);
	IMPORTE$ NUMBER(12,2);--CORRESPONDE AL IMPORTE REGISTRADO EN TABLA DESCUENTO
	IDINSCRIPCION$ NUMBER(8);
	IDCARGO$ NUMBER(8);
	IDINSCRIPCION2$ NUMBER(8);

	FECHAPAGO$ DATE:=SYSDATE;
	ABONADO$ NUMBER(11,2);
	IMPORTE2$ NUMBER(11,2);--CORRESPONDE AL IMPORTE REGISTRADO EN TABLA CARGO
	PARAMETRO_ABONO$ NUMBER(11,2);

BEGIN
	GENERAR_CVS;--ANTES QUE NADA, SE CORROBORA QUE NO SE TENGA QUE CALCULAR NUEVOS CARGOS POR CVS
	SELECT COUNT(*) INTO EXISTEN_REGS$ FROM DESCUENTO;
	IF EXISTEN_REGS$ = 0 THEN
		DBMS_OUTPUT.PUT_LINE('NO EXISTEN DESCUENTOS');
	ELSE
		SELECT COUNT(*) INTO EXISTE_DESC$ FROM DESCUENTO WHERE IDDESCUENTO=IDDESCUENTO$;
		IF EXISTE_DESC$=0 THEN
			DBMS_OUTPUT.PUT_LINE('NO EXISTE EL DESCUENTO EN CUESTION');
		ELSE -- EL IDDESCUENTO EXISTE
			SELECT COUNT(*) INTO YA_APLICADO$ FROM DESCUENTO WHERE IDDESCUENTO=IDDESCUENTO$ AND (REMUNERADO='SI' OR APLICADO='SI');
			IF YA_APLICADO$>0 THEN
				DBMS_OUTPUT.PUT_LINE('EL DESCUENTO YA HA SIDO REMUNERADO O APLICADO CON ANTERIORIDAD');
			ELSE--SI NO HA SIDO REMUNERADO
				--SELECT COUNT(*) INTO EXISTE_CARGO$ FROM DESCUENTO WHERE IDDESCUENTO=IDDESCUENTO$;
				--###
				SELECT IDCARGO INTO IDCARGO$ FROM DESCUENTO WHERE IDDESCUENTO=IDDESCUENTO$;--EL CARGO QUE GENERO EL DESCUENTO
				SELECT COUNT(*) INTO EXISTE_CARGO$ FROM CARGO WHERE IDCARGO=CARGOAPLICADO$;--EL CARGO AL QUE SE LE APLICARA DESCUENTO
				IF EXISTE_CARGO$=0 THEN
					DBMS_OUTPUT.PUT_LINE('NO EXISTE EL CARGO EN CUESTION');
				ELSE 	--SI--EXISTE EL CARGO EN LA TABLA CARGO


					SELECT IDINSCRIPCION INTO IDINSCRIPCION$ FROM CARGO WHERE IDCARGO=IDCARGO$;--LA INSCRIPCION QUE GENERO AL DESCUENTO
					SELECT IDINSCRIPCION INTO IDINSCRIPCION2$ FROM CARGO WHERE IDCARGO=CARGOAPLICADO$;--LA INSC QUE GNRO EL CARGO QUE SE DESEA APLICAR DESC

					IF IDINSCRIPCION$=IDINSCRIPCION2$ THEN --SI PERTENECE A LA MISMA INSCRIPCION

						SELECT ABONO,IMPORTE INTO ABONADO$,IMPORTE2$ FROM CARGO WHERE IDCARGO=CARGOAPLICADO$;
						IF SQL%NOTFOUND THEN
							DBMS_OUTPUT.PUT_LINE('NO EXISTE EL CARGO A SALDAR');
						ELSE
							IF ABONADO$ > 0 THEN --SÒLO SE PUEDE ABONAR UNA ÙNICA VEZ	
								DBMS_OUTPUT.PUT_LINE('ESTE CARGO YA HA SIDO ABONADO TOTAL O PARCIALMENTE');
							ELSE


								UPDATE DESCUENTO SET APLICADO='SI',CARGOAPLICADO=CARGOAPLICADO$ WHERE IDDESCUENTO=IDDESCUENTO$;
								SELECT IMPORTE INTO IMPORTE$ FROM DESCUENTO WHERE IDDESCUENTO=IDDESCUENTO$;
								
								PARAMETRO_ABONO$:=IMPORTE$;
								IF IMPORTE$ > IMPORTE2$ THEN
									DBMS_OUTPUT.PUT_LINE('EL MONTO DEL DESCUENTO EXCEDE AL IMPORTE DEL CARGO, SOLO SE PAGARA EL IMPORTE');
									PARAMETRO_ABONO$:=IMPORTE2$;
								END IF;

								UPDATE CARGO SET ABONO=PARAMETRO_ABONO$, FECHAPAGO=FECHAPAGO$ WHERE IDCARGO=CARGOAPLICADO$;
								DBMS_OUTPUT.PUT_LINE('SE APLICO EL DESCUENTO');
								COMMIT;
								PROC_AFTER_GENERA_DESCUENTO(CARGOAPLICADO$);--LLAMA AL PROCEDIMIENTO QUE GENARA LOS DESCUENTOS
							END IF;
						END IF;
					ELSE 	--NO SE TRATA DE LA MISMA INSCRIPCION
						DBMS_OUTPUT.PUT_LINE('NO SE`PUEDE APLICAR EL DESCUENTO, DEBIDO A QUE EL CARGO PERTENECE A OTRA INSCRIPCION');
					END IF;

				END IF;

			END IF;			
		END IF;		
	END IF;
EXCEPTION
	WHEN NO_DATA_FOUND THEN
		DBMS_OUTPUT.PUT_LINE('INGRESO CARGO O DESCUENTO NO VALIDOS');

END APLICAR_DESCUENTO;
/

EXEC APLICAR_DESCUENTO(10000004,10000022);

--#######################################

CREATE TABLE ALUMNO_RESPONSABLE
(
	IDALUMNO			NUMBER(8),
	IDRESPONSABLE 		NUMBER(8),
	CONSTRAINT IDALUMNO_FK FOREIGN KEY(IDALUMNO) REFERENCES ALUMNO,
	CONSTRAINT A_RIDRESPONSABLE_FK FOREIGN KEY(IDRESPONSABLE) REFERENCES RESPONSABLE ON DELETE SET NULL,
	CONSTRAINT ALU_RES_UNIQUE UNIQUE(IDALUMNO,IDRESPONSABLE)
);


CREATE OR REPLACE PROCEDURE ALTA_ALUMNO_RESPONSABLE(IDALUMNO$ IN NUMBER,IDRESPONSABLE$ IN NUMBER)
AS 	
	REGS_ALUMNO$ NUMBER(8);
	REGS_RESPONSABLE$ NUMBER(8);
	YA_EXISTE$ NUMBER(8);
	EXITE_ALUMNO$ NUMBER(8);
	EXISTE_RESP$ NUMBER(8);
BEGIN
	SELECT COUNT(*) INTO REGS_ALUMNO$ FROM ALUMNO;
	SELECT COUNT(*) INTO REGS_RESPONSABLE$ FROM RESPONSABLE;
	IF (REGS_ALUMNO$ > 0) AND (REGS_RESPONSABLE$ > 0) THEN
		SELECT COUNT(*) INTO YA_EXISTE$ FROM ALUMNO_RESPONSABLE WHERE IDALUMNO=IDALUMNO$ AND IDRESPONSABLE=IDRESPONSABLE$;
		IF YA_EXISTE$=0 THEN --SI NO EXISTE REGISTRO DUPLICADO
			SELECT COUNT(*) INTO EXITE_ALUMNO$ FROM ALUMNO WHERE IDALUMNO=IDALUMNO$;
			SELECT COUNT(*) INTO EXISTE_RESP$ FROM RESPONSABLE WHERE IDRESPONSABLE=IDRESPONSABLE$;
			IF EXITE_ALUMNO$=0 OR EXISTE_RESP$=0 THEN --SI ALGUNO NO EXISTE
				DBMS_OUTPUT.PUT_LINE('EL ALUMNO O RESPONSABLE NO EXISTEN EN TABLAS PADRE');
			ELSE
				INSERT INTO ALUMNO_RESPONSABLE(IDALUMNO,IDRESPONSABLE) VALUES(IDALUMNO$,IDRESPONSABLE$);
				DBMS_OUTPUT.PUT_LINE('SE AGREGO EL REGISTRO');
				COMMIT;
			END IF;
		ELSE 	--SI YA EXISTE
			DBMS_OUTPUT.PUT_LINE('EL REGISTRO YA EXISTE');
		END IF;
	ELSE
		DBMS_OUTPUT.PUT_LINE('NO HAY REGISTROS PADRES EN TABLAS ALUMNO O RESPONSABLE');
	END IF;
EXCEPTION
	WHEN NO_DATA_FOUND THEN
		DBMS_OUTPUT.PUT_LINE('REGISTRO NO ALMACENADO');
END ALTA_ALUMNO_RESPONSABLE;
/


EXEC ALTA_ALUMNO_RESPONSABLE(10000003,10000002);
EXEC ALTA_ALUMNO_RESPONSABLE(10000003,10000001);
EXEC ALTA_ALUMNO_RESPONSABLE(10000002,10000002);
EXEC ALTA_ALUMNO_RESPONSABLE(10000002,10000001);

--**********

CREATE OR REPLACE PROCEDURE BAJA_ALUMNO_RESPONSABLE(IDALUMNO$ IN NUMBER,IDRESPONSABLE$ IN NUMBER)
AS 	
	EXISTE_ALU_RESP$ NUMBER(8);
	TABLA_NO_VACIA$ NUMBER(8);
BEGIN
	SELECT COUNT(*) INTO TABLA_NO_VACIA$ FROM ALUMNO_RESPONSABLE;
	IF TABLA_NO_VACIA$=0 THEN --TABLA VACIA
		DBMS_OUTPUT.PUT_LINE('NO EXISTEN REGISTROS');
	ELSE --TABLA NO VACIA
		SELECT COUNT(*) INTO EXISTE_ALU_RESP$ FROM ALUMNO_RESPONSABLE WHERE IDALUMNO=IDALUMNO$ AND IDRESPONSABLE=IDRESPONSABLE$;
		IF EXISTE_ALU_RESP$=0 THEN --SI NO EXISTE EL REGISTRO
			DBMS_OUTPUT.PUT_LINE('NO EXISTE EL REGISTRO');
		ELSE
			DELETE FROM ALUMNO_RESPONSABLE WHERE IDALUMNO=IDALUMNO$ AND IDRESPONSABLE=IDRESPONSABLE$;
			DBMS_OUTPUT.PUT_LINE('SE ELIMINO EL REGISTRO');
			COMMIT;			
		END IF;

	END IF;

EXCEPTION
	WHEN NO_DATA_FOUND THEN
		DBMS_OUTPUT.PUT_LINE('REGISTRO NO ELIMINADO');
END BAJA_ALUMNO_RESPONSABLE;
/

EXEC BAJA_ALUMNO_RESPONSABLE(10000002,10000002);

--+++++++++++++++

DECLARE
	CAD1$ VARCHAR2(8);
	CAD2$ VARCHAR2(8);
	FECHA1$ DATE;
	FECHA2$ DATE;
BEGIN
	
	FECHA1$:=SYSDATE;
	CAD1$:=TO_CHAR(FECHA1$);
	FECHA1$:=TO_DATE(CAD1$);
	DBMS_OUTPUT.PUT_LINE('CAD1 '||CAD1$);

	IF FECHA1$='09/05/13' THEN
		DBMS_OUTPUT.PUT_LINE('ACTUAL:'||SYSDATE);
	END IF;
END;
/

CREATE OR REPLACE FUNCTION GET_FECHA_ACTUAL(FECHA$ DATE)
RETURN DATE
IS
	CAD1$ VARCHAR2(8);
	FECHA_ACTUAL$ DATE;	
BEGIN
	CAD1$:=TO_CHAR(FECHA$);
	FECHA_ACTUAL$:=TO_DATE(CAD1$);
RETURN(FECHA_ACTUAL$);
END GET_FECHA_ACTUAL;
/


DECLARE
BEGIN
	DBMS_OUTPUT.PUT_LINE(LAST_DAY(SYSDATE));
END;
/

SELECT * FROM CARGO;

SELECT SUM(IMPORTE) FROM (((TUTOR NATURAL JOIN ALUMNO) NATURAL JOIN INSCRIPCION) NATURAL JOIN CARGO) WHERE RFC='ALFF920101ABC';

SELECT RFC,IDALUMNO FROM ALUMNO;

SELECT RFC,IDALUMNO FROM ALUMNO WHERE RFC='ALFF920101ABC';

SELECT IDINSCRIPCION, IDALUMNO FROM INSCRIPCION WHERE IDALUMNO=10000001;

SELECT IDCARGO FROM (((TUTOR NATURAL JOIN ALUMNO) NATURAL JOIN INSCRIPCION) NATURAL JOIN CARGO) WHERE RFC='ALFF920101ABC' AND ABONO=0;

ALFF920101ABC
--**CONSULTA 2
CREATE OR REPLACE PROCEDURE VER_DEUDA_TOTAL_TUTOR(RFC$ IN CHAR)
AS
	DEUDA_TUTOR$ NUMBER(12,2);
BEGIN
	SELECT SUM(IMPORTE) INTO  DEUDA_TUTOR$ FROM (((TUTOR NATURAL JOIN ALUMNO) NATURAL JOIN INSCRIPCION) NATURAL JOIN CARGO) WHERE RFC=RFC$ AND ABONO=0;
	DBMS_OUTPUT.PUT_LINE('lA DEUDA DEL TUTOR ASCIENDE A: '||DEUDA_TUTOR$);
END VER_DEUDA_TOTAL_TUTOR;
/

EXEC VER_DEUDA_TOTAL_TUTOR('ALFF920101ABC');
--**CONSULTA 3
CREATE OR REPLACE PROCEDURE CARGOS_PENDIENTES_TUTOR_ALU(RFC$ IN CHAR,IDALUMNO$ IN NUMBER)
AS
	CARGOS_PEND$ NUMBER(12,2);
BEGIN
	SELECT COUNT(*)  INTO CARGOS_PEND$ FROM (((TUTOR NATURAL JOIN ALUMNO) NATURAL JOIN INSCRIPCION) NATURAL JOIN CARGO) WHERE RFC=RFC$ AND ABONO=0 AND IDALUMNO=IDALUMNO$;
	DBMS_OUTPUT.PUT_LINE('EL NUMERO DE CARGOS PENDIENTES DEL TUTOR POR ESTE ALUMNO ES: '||CARGOS_PEND$);
END CARGOS_PENDIENTES_TUTOR_ALU;
/

EXEC CARGOS_PENDIENTES_TUTOR_ALU('ALFF920101ABC',10000001);


SELECT COUNT(*)  NUM_CARGOS_PENDIENTES FROM (((TUTOR NATURAL JOIN ALUMNO) NATURAL JOIN INSCRIPCION) NATURAL JOIN CARGO) WHERE RFC='ALFF920101ABC' AND ABONO=0 AND IDALUMNO=10000001;









